iT邦幫忙

2023 iThome 鐵人賽

DAY 20
1
Mobile Development

在 iOS 專案上加上 Unit testing - 因為 You need testing系列 第 20

D20 - 在 iOS 專案加上測試-You need testing {台股小工具 app-測 UserDefaults part2}

  • 分享至 

  • xImage
  •  

step1: 開好測試 class 後,將 TapCounterViewController 設成 sut,把 FakeUserDefaults 設定好變數。在 setup 和 tear down 的部分,將物件寫好。

在單元測試中,SUT 代表的是 “System Under Test”,也就是被測試的系統1。從單元測試的角度來看,被測試的系統代表了在測試中所有不是預定義的程式碼片段,如 stubs 或 mocks 的類別1。換句話說,SUT 是你想要測試的對象2。1

/// TapCounterViewControllerTests.swift
import XCTest
@testable import TwStockTools

final class TapCounterViewControllerTests: XCTestCase {

    private var sut: TapCounterViewController!
    
    private var defaults: FakeUserDefaults!
    
    override func setUpWithError() throws {
        try super.setUpWithError()
        sut = TapCounterViewController()
        defaults = FakeUserDefaults()
        sut.userDefaults = defaults
    }

    override func tearDownWithError() throws {
        sut = nil
        defaults = nil
        try super.tearDownWithError()
    }
}

step2: 開始測 sut 的 label,請務必要呼叫 loadViewIfNeeded(),不然 sut 會有預期以外的行為。先寫個”0”,來保證測試會 failed

func testLabelWith6() {
        
        defaults.set(6, forKey: "tapCount")
        /// 要呼叫 loadViewIfNeeded() 不然 UI 元件反應會不如預期
        sut.loadViewIfNeeded()
        XCTAssertEqual(sut.countLabel.text, "0")
    }

https://ithelp.ithome.com.tw/upload/images/20231001/20140622wjEhQuPIVH.png

待測試 failed 後,再將正確的值補上去

https://ithelp.ithome.com.tw/upload/images/20231001/20140622MDe0HRVHnC.png

step3: 除了正確的 Label 以外,我們還有一個 UIButton 要測試。可以使用 sendActions(:) 來觸發 button 本來設定好的 action,這邊就直接跳到正確的結果了,不再貼上錯誤的第一次。

func testButtonTapped() {
        /// 要呼叫 loadViewIfNeeded() 不然 UI 元件反應會不如預期
        sut.loadViewIfNeeded()
        /// 在 unit testing 中讓 button 發動 touchUpInside Action
        sut.addButton.sendActions(for: .touchUpInside)
        
        XCTAssertEqual(sut.countLabel.text, "已經點擊了 1 下")
    }

https://ithelp.ithome.com.tw/upload/images/20231001/201406224g9jWWdAdm.png

Voilà,你測試了 UserDefaultsProtocol,也測完了 TapCounterViewController 與 UserDefaultsProtocol 的互動。


上一篇
D19 - 在 iOS 專案加上測試-You need testing {台股小工具 app-測 UserDefaults part1}
下一篇
D21 - 在 iOS 專案加上測試-You need testing {測試 async/await function}
系列文
在 iOS 專案上加上 Unit testing - 因為 You need testing32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言